<?php

namespace app\admin\model\scanwork;

use think\Model;

class Report extends Model
{
    // 表名
    protected $name = 'scanwork_report';
    
    // 自动写入时间戳字段
    protected $autoWriteTimestamp = 'int';

    // 定义时间戳字段名
    protected $createTime = 'createtime';
    protected $updateTime = 'updatetime';
    protected $deleteTime = false;

    // 追加属性
    protected $append = [
        'status_text',
        'work_type_text',
    ];
    
    public function getStatusList()
    {
        return ['0' => __('待审核'), '1' => __('已确认'), '2' => __('已拒绝')];
    }

    public function getStatusTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
        $list = $this->getStatusList();
        return isset($list[$value]) ? $list[$value] : '';
    }

    public function getWorkTypeList()
    {
        return ['piece' => '计件', 'time' => '计时'];
    }

    public function getWorkTypeTextAttr($value, $data)
    {
        $value = $value ? $value : (isset($data['work_type']) ? $data['work_type'] : '');
        $list = $this->getWorkTypeList();
        return isset($list[$value]) ? $list[$value] : '';
    }

    // 关联分工分配
    public function allocation()
    {
        return $this->belongsTo('app\admin\model\scanwork\Allocation', 'allocation_id', 'id');
    }

    // 关联员工
    public function user()
    {
        return $this->belongsTo('app\common\model\User', 'user_id', 'id');
    }

    // 关联订单
    public function order()
    {
        return $this->belongsTo('Order', 'order_id', 'id');
    }

    // 关联产品型号
    public function model()
    {
        return $this->belongsTo('ProductModel', 'model_id', 'id');
    }

    // 关联工序
    public function process()
    {
        return $this->belongsTo('Process', 'process_id', 'id');
    }

    // 关联报工图片
    public function images()
    {
        return $this->hasMany('ReportImage', 'report_id', 'id');
    }

    // 关联审核图片
    public function auditImages()
    {
        return $this->hasMany('AuditImage', 'report_id', 'id');
    }
    
    // 关联溯源码
    public function traceCode()
    {
        return $this->hasOne('TraceCode', 'report_id', 'id');
    }


    
    /**
     * 确认报工
     */
    public function confirm()
    {
        if ($this->status == 1) {
            return true; // 已经确认过了
        }
        
        // 获取分配记录
        $allocation = $this->allocation;
        if (!$allocation) {
            throw new \Exception('分配记录不存在');
        }
        
        // 计算工资
        $price = $allocation->price; // 使用Allocation模型的getPriceAttr方法
        $this->wage = $price * $this->quantity;
        
        // 更新状态
        $this->status = 1;
        
        // 保存
        $result = $this->save();
        
        if ($result) {
            // 检查是否完成
            $reportedQuantity = $allocation->reports()->where('status', 1)->sum('quantity');
            if ($reportedQuantity >= $allocation->quantity) {
                $allocation->status = 1; // 已完成
                $allocation->save();
            }
        }
        
        return $result;
    }
    
    /**
     * 拒绝报工
     */
    public function reject($reason = '')
    {
        if ($this->status == 2) {
            return true; // 已经拒绝过了
        }
        
        // 开始事务
        \think\Db::startTrans();
        try {
            // 如果是计件报工，需要处理产品编号
            if (!empty($this->item_nos)) {
                $itemNos = json_decode($this->item_nos, true);
                if (is_array($itemNos)) {
                    // 删除产品编号报工图片
                    foreach ($itemNos as $itemNo) {
                        $item = \app\admin\model\scanwork\ProductItem::where('item_no', $itemNo)->find();
                        if ($item) {
                            // 删除产品编号报工图片记录（整行数据）
                            $itemImages = \think\Db::name('scanwork_item_report_image')
                                ->where('item_id', $item->id)
                                ->where('report_id', $this->id)
                                ->select();
                            
                            foreach ($itemImages as $image) {
                                // 删除物理文件
                                $filePath = ROOT_PATH . 'public' . $image['image_url'];
                                if (file_exists($filePath)) {
                                    unlink($filePath);
                                }
                            }
                            
                            // 删除fa_scanwork_item_report_image表中的整行数据
                            $deleteResult = \think\Db::name('scanwork_item_report_image')
                                ->where('item_id', $item->id)
                                ->where('report_id', $this->id)
                                ->delete();
                            
                            // 记录删除结果用于调试
                            error_log("删除产品编号{$itemNo}的报工图片记录，结果：{$deleteResult}");
                            
                            // 重置fa_scanwork_product_item表的status为0（可重新报工）
                            $updateResult = \think\Db::name('scanwork_product_item')
                                ->where('id', $item->id)
                                ->update([
                                    'status' => 0,
                                    'report_id' => null,
                                    'updatetime' => time()
                                ]);
                            
                            // 记录更新结果用于调试
                            error_log("重置产品编号{$itemNo}状态为0，结果：{$updateResult}");
                        }
                    }
                }
            }
            
            // 删除普通报工图片（计时工作）
            $images = \think\Db::name('scanwork_report_image')
                ->where('report_id', $this->id)
                ->select();
            
            foreach ($images as $image) {
                // 删除物理文件
                $filePath = ROOT_PATH . 'public' . $image['image_url'];
                if (file_exists($filePath)) {
                    unlink($filePath);
                }
            }
            
            // 删除数据库记录
            \think\Db::name('scanwork_report_image')
                ->where('report_id', $this->id)
                ->delete();
            
            // 更新状态为拒绝
            $this->status = 2;
            $this->reject_reason = $reason;
            $this->wage = 0; // 拒绝后工资清零
            
            $result = $this->save();
            
            \think\Db::commit();
            return $result;
            
        } catch (\Exception $e) {
            \think\Db::rollback();
            throw $e;
        }
    }
} 